//
//  WBUserAccountViewModel.swift
//  SinaWeibo
//
//  Created by zhuangqianwei on 16/11/15.
//  Copyright © 2016年 zhuangqianwei. All rights reserved.
//

import UIKit
import SVProgressHUD
private let path = (NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last! as NSString).appendingPathComponent("account.plist")
/*
 
 封装数据逻辑处理
 封装网络请求
 封装数据缓存

 */
//视图模型就是为了 让view或者控制器能够方便的使用数据  -> 必须拥有模型数据
class WBUserAccountViewModel: NSObject {
    
    //视图模型需要引用  模型对象  --> 视图模型需要处理数据逻辑
    var userAccount: WBUserAccount?
    
    //单例对象 全局只有一个登陆的用户,之存储一个用户的account.plist文件,一旦用户注销登陆之后就应该删除account.plist
    static let shared: WBUserAccountViewModel = WBUserAccountViewModel()
    
    //重写构造函数
    //在用户已经登录的情况下给模型赋值
    override init() {
        super.init()
        //保证以后再判断是否登录的时候 不在访问磁盘
        //将磁盘数据保存在内存中
        userAccount = self.loadUserAccount()
    }
    
    //增加一个用户纯种URL类型的头像地址
    var headURL: URL? {
        return URL(string: userAccount?.avatar_large ?? "")
    }

    var access_token: String? {
        return userAccount?.access_token
    }
    
    //判断用户是否登录
    //计算型属性
    var userLogin: Bool {
        
        //满足以下条件就认为用户已经登录
        if userAccount?.access_token != nil && isExpires == false {
            return true
        }
        
        //默认没有登录
        return false
    }
    
    //判断令牌是否过期
    var isExpires: Bool {
        //满足以下条件就认为没有过期
        //过期日期 比当前日期要大的时候就没有过期
        //2016.11.17  2016.11.15
        if userAccount?.expires_date?.compare(Date()) ==  ComparisonResult.orderedDescending {
            return false
        }
        //默认过期
        return true
    }
    
    
    
    //获取用户token
    func loadAccessToken(code: String, finished: @escaping (Bool) -> ()) {
        let urlStirng = "https://api.weibo.com/oauth2/access_token"
        let parameters = ["client_id" : client_id,
                          "client_secret" : client_secret,
                          "grant_type" : "authorization_code",
                          "code" : code,
                          "redirect_uri" : redirect_uri]
        ZQWNetworkTools.shared.request(method: .POST, UrlSting: urlStirng, parameter: parameters) { (responseObject, error) in
            if error != nil {
                finished(false)
                return
            }
            //请求成功
            //使用access_token 和 uid 来请求用户信息\
            //获取用户信息
            self.loadUserInfo(dict: responseObject as! [String : Any],loadUserInfofinished: finished)
            
        }
        
    }
    
    private func loadUserInfo(dict: [String : Any],loadUserInfofinished: @escaping (Bool) -> ()) {
        
        let urlString = "https://api.weibo.com/2/users/show.json"
        let token = dict["access_token"]!
        let uid = dict["uid"]!
        
        let parameters = ["access_token" : token,
                          "uid" : uid]
        print(parameters)
        ZQWNetworkTools.shared.request(method: .GET, UrlSting: urlString, parameter: parameters) { (responseObject, error) in
            if error != nil {
                
                //执行失败的回调
                loadUserInfofinished(false)
                return
            }
            
            
            //将用户信息存储在本地
            //需要将授权之后的得到的字典和用户信息字典合并 之后再存储
            var userInfoDict = responseObject as! [String : Any]
            for (key,value) in dict {
                userInfoDict[key] = value
            }
            
            //需要将userInfodict转换模型对象
            //用归档的方式存储自定义模型对象
            //自定转模型
            let userAccount = WBUserAccount(dict: userInfoDict)
            self.saveUserAccount(userAccount: userAccount)
            //给单例对象的模型对象赋值
            //如果不写,首次登录的时候会有bug
            self.userAccount = userAccount
            //执行成功的回调
            loadUserInfofinished(true)
        }
    }
    
    
    // 存储模型对象
    // - Parameter userAccount: 模型
    private func saveUserAccount(userAccount: WBUserAccount) {
        //存储在沙盒的Document或者Library,temp 不会备份
        //拼接文件路径的方法String 没有 需要转换为NSString
        //使用默认转换的前提: 被转换的类型不能够为可选类型对象
        //存储自定义对象,自定义对象必须遵守 NSCoding协议 实现协议方法\
        NSKeyedArchiver.archiveRootObject(userAccount, toFile: path)
        print(path)
        
    }
    
    // 读取磁盘
    private func loadUserAccount() -> WBUserAccount? {
        //调用解档的方法
        let account = NSKeyedUnarchiver.unarchiveObject(withFile: path)
        if let userAccount = account as? WBUserAccount {
            return userAccount
        }
        return nil
    }
}

    
    

